2.1返回给定字符串表达式的字符个数。
(1)函数头
static void lengthFunc( sqlite3_context context,int argc, sqlite3_value *argv)
返回字符长度
(2)函数实现流程
字符串表达式如果是SQLITE_BLOB,SQLITE_INTEGER,不输出任何值
若给定字符串表达式是SQLITE_FLOAT,返回字符串长度
若给定字符串表达式是SQLITE_TEXT,判断字符串是否为0,若为0 ,则返回长度0如果字符串不为0,返回字符串表达式长度
若给定字符串表达式与以上都不匹配,则返回空值
如图为lengthFunc函数实现流程
2.2将小写字符数据转换为大写的字符表达式upperFunc
(1)函数头
static void upperFunc(sqlite3_context context, int argc, sqlite3_value *argv)
返回将小写字符数据转换为大写的字符表达式
(2)函数实现流程
判断字符串z2是否存在,若存在,给字符串z1分配空间,同时若z1存在,循环z1中的各个字符,将字符串z2的小写字符转换为大写字符赋值给z1
释放z1,返回字符串z1
2.3将大写字符数据转换为小写字符数据后返回字符表达式lowerFunc
(1)static void lowerFunc(sqlite3_context context, int argc, sqlite3_value *argv)
返回将大写字符数据转换为小写的字符表达式
(2)函数实现流程
判断字符串z2是否存在,若存在,给字符串z1分配空间,同时若z1存在,循环z1中的各个字符,将字符串z2的大写字符转换为小写字符赋值给z1
释放z1,返回字符串z1
如图为lowerFunc函数实现流程
2.4返回表达式的一部分字符串substrFunc
static void substrFunc(sqlite3_context context, int argc, sqlite3_value *argv)
substr(x,p1,p2)是返回从p1(字符串中指定起始位置)开始查找x[]的p2(返回的字符串长度)个的字符。所以substr(x,1,1)返回第一个字符x,
如果x是文本,那么我们实际上计算utf - 8字符数。
如果x是一个blob(二进制),那么我们计数字节。
如果p1是负的,那么我们开始从abs(p1)中x[]尾端算起。例:substr("ABCDEFG", -3,2),返回EF
如果p2是负的,返回从x[]尾端算起p2个字符。substr("ABCDEFG", 0,-2),返回FG
2.5确定给定的字符串是否与指定的模式匹配。likeFunc
(1)函数头
static void likeFunc( sqlite3_context context, int argc, sqlite3_value*argv)
实现SQL like()函数,这个函数实现了内置的LIKE操作符。函数的第一个参数是模式和第二个参数是字符串。因此SOL语句为 A LIKE B 被实现为like(B,A).同样的功能(不同的compareInfo结构)计算通配符匹配操作符运算符。
(2) 函数实现流程
给要比较的两个模式zA和zB赋值,限制LIKE模式中zA和zB的长度以避免在patternCompare()里的太复杂
保持zB编码没有以改变, 转义字符的字符串zEsc必须包括一个单UTF-8字符。 否则,返回一个错误。
判断模式zA和模式zB是否存在,若存在,进入compareInfo结构定义中做LIKE模式匹配,如果比较的两个比较两个UTF-8字符串相等,返回true,如果他们两个不相等,返回false